package com.example.toy.core.record;

import com.example.toy.core.merge.MergeMode;
import com.example.toy.core.record.key.ToyRecordKey;
import com.example.toy.core.version.ToyVersion;
import org.apache.avro.Schema;

import java.util.List;

/** 表记录 */
public interface ToyRecord {

  /**
   * 主键
   *
   * @return
   */
  ToyRecordKey getKey();

  /**
   * 字段模式
   *
   * @return
   */
  Schema getSchema();

  /**
   * 版本
   *
   * @return
   */
  ToyVersion getVersion();

  /**
   * 合并策略
   *
   * @return
   */
  MergeMode getMergeMode();

  /**
   * 合并一条数据 TODO 需要设计一下 current record、preRecord、return record 三者之间的关系
   *
   * @param preRecord 上一个版本的表记录
   * @return
   */
  ToyRecord merge(ToyRecord preRecord);

  /**
   * 获取指定字段名的字段值
   *
   * @param name
   * @return
   */
  Object getFieldValue(String name);

  /**
   * 获取指定位置的字段值
   *
   * @param index
   * @return
   */
  Object getFieldValueAt(int index);

  /**
   * 获取指定字段的类型
   *
   * @param name
   * @return
   */
  default Schema getFieldSchema(String name) {
    Schema schema = getSchema();
    for (Schema.Field field : schema.getFields()) {
      if (field.name().equals(name)) {
        return field.schema();
      }
    }
    throw new IllegalArgumentException("Can not find available field: " + name);
  }

  /**
   * 获取指定位置字段的类型
   *
   * @param index
   * @return
   */
  default Schema getFieldSchemaAt(int index) {
    List<Schema.Field> fields = getSchema().getFields();
    return fields.get(index).schema();
  }
}
